package br.senai.sc.web.usuarios.beans;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;

import org.jboss.seam.international.status.Messages;
import org.jboss.seam.international.status.builder.BundleKey;
import org.jboss.seam.security.Identity;

import br.senai.sc.controller.crud.UsuarioCRUD;
import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.Permissao;
import br.senai.sc.model.Usuario;
import br.senai.sc.util.SystemConstants;

/**
 * Bean utilizado nas telas de usuário.
 * 
 * @author Fernando Marquardt &lt;fernando.marquardt@sc.senai.br&gt;
 * @version $Id: UsuarioBean.java 28 2012-03-07 20:48:20Z fernando.marquardt $
 */
@Named
@ViewScoped
public class UsuarioBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private UsuarioCRUD usuarioCRUD;

    @Inject
    private Messages messages;

    @Inject
    private Identity identity;

    private Usuario usuario;

    private DataModel<Usuario> usuarios;

    /**
     * Cadastra um novo usuário.
     */
    public void cadastrarUsuario() {
        usuario = new Usuario();
    }

    /**
     * Carrega o usuário selecionado na lista.
     */
    public void carregarUsuario() {
        usuario = getUsuarios().getRowData();
    }

    /**
     * Salva os dados do usuário.
     */
    public void salvarUsuario() {

        try {
            usuarios = null;
            usuario = usuarioCRUD.salvar(usuario);
            usuario = null;
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES,
                                        "usuarios.cadastrar.sucesso"));
        } catch (BusinessException e) {}
    }

    /**
     * Remove um usuário do sistema.
     */
    public void removerUsuario() {

        try {
            usuarioCRUD.remover(usuario);
            usuario = null;
            usuarios = null;
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "usuarios.remover.sucesso"));
        } catch (BusinessException e) {}
    }

    /**
     * Método que verifica se o botão de remover usuário pode ser mostrado. Caso
     * o usuário em questão for o próprio usuário logado, ele não deve ter
     * permissão de remover à si próprio.
     * 
     * @return Retorna true se o botão puder ser aprensetando.
     */
    public boolean isMostrarBotaoRemover() {
        return !(usuarios.getRowData().getIdUsuario().equals(Integer
                                                                    .valueOf(identity.getUser().getId())));
    }

    /**
     * Busca os usuários cadastros no sistema.
     * 
     * @return Retorna os usuários encontrados.
     */
    public DataModel<Usuario> getUsuarios() {
        if (usuarios == null) {
            usuarios = new ListDataModel<Usuario>(usuarioCRUD.findUsuarios());
        }

        return usuarios;
    }

    /**
     * Busca as permissões que podem ser atribuídas à um usuário no cadastro.
     * 
     * @return Permissões encontradas.
     */
    public List<Permissao> getPermissoes() {
        return usuarioCRUD.findPermissoes();
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}